package com.c2b.algorithm.leetcode.hot100;

import java.util.HashMap;
import java.util.Map;

/**
 * 两数之和
 *
 * @author c2b
 * @since 2022/4/29 14:11
 */
public class Hot001TwoSum {

    private Hot001TwoSum() {
    }

    /**
     * <p>给定一个整数数组 nums 和一个整数目标值 target，请你在该数组中找出和为目标值 target 的那两个整数，并返回它们的数组下标。
     * <p>你可以假设每种输入只会对应一个答案。但是，数组中同一个元素在答案里不能重复出现。
     * <p>你可以按任意顺序返回答案。
     * <p>---------------------------------------------
     * <p>输入：nums = [2,7,11,15], target = 9
     * <p>输出：[0,1]
     * <p>解释：因为 nums[0] + nums[1] == 9 ，返回 [0, 1] 。
     * <p>---------------------------------------------
     * <p>输入：nums = [3,2,4], target = 6
     * <p>输出：[1,2]
     * <p>---------------------------------------------
     *
     * @param nums   整数数组
     * @param target 目标值
     * @return 数组中和为目标值的数组下标
     * @author c2b
     * @since 2022/4/29 14:12
     */
    public static int[] twoSum(int[] nums, int target) {
        if (null == nums || nums.length < 2) {
            return new int[0];
        }
        // hashmap
        Map<Integer, Integer> map = new HashMap<>(16);
        // 双指针
        int leftIndex = 0;
        int rightIndex = nums.length - 1;
        while (leftIndex <= rightIndex) {
            int leftNumVal = nums[leftIndex];
            if (map.containsKey(target - leftNumVal)) {
                return new int[]{map.get(target - leftNumVal), leftIndex};
            }
            map.put(leftNumVal, leftIndex++);
            int rightNumVal = nums[rightIndex];
            if (map.containsKey(target - rightNumVal)) {
                return new int[]{map.get(target - rightNumVal), rightIndex};
            }
            map.put(rightNumVal, rightIndex--);
        }
        return new int[0];
    }
}
